package odhgospolhs_omada_kklmm_DBController;

import Odhgos_Polhs.*;
import java.sql.*;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.logging.Level;
import java.util.logging.Logger;
 
/*
 * Κλαση ελέγχου που αναλαμβάνει την επικοινωνία του γραφικού ενδιάμεσου
 * χρήστη με την κλάση διαχείρισης βάσης, DBManager
 * 
 */

public class DBInterface {
   
    //Attributes
    // Arraylists από Εστιατόρια, Περιοχές, Κατηγορίες, Εύρος Τιμών, Κρατήσεις,
    //                Αξιολογήσεις, Λογαριασμούς
    
    static ArrayList<Area> areaDBList = new ArrayList<Area>();
    static ArrayList<Category> categoryDBList = new ArrayList<Category>();
    static ArrayList<PriceRange> priceRangeDBList = new ArrayList<PriceRange>();
    static ArrayList<Restaurant> restaurantsDBList = new ArrayList<Restaurant>();
    static ArrayList<RegUser> usersDBList = new ArrayList<RegUser>();
    static ArrayList<Evaluation> evalDBList = new ArrayList<Evaluation>();
    static ArrayList<Reservation> reservDBList = new ArrayList<Reservation>();
    private ArrayList<Account> accountDBList = new ArrayList<Account>();
    private DBManager dbm = new DBManager();

    //Constructor
    public DBInterface() {
    }
    
    
    /* Μέθοδος για ανάκτηση των Περιοχών
     * επιστροφή αντικειμένου τύπου Area
     */
/*     public ArrayList<Area> retrieveAreas()throws SQLException{
            ResultSet rs=DBManager.selectArea.executeQuery();
            while (rs.next()){
                   int AreaId = rs.getInt(1);
                   String AreaName = rs.getString(2);
                   Area area = new Area(AreaId, AreaName);
                   areaDBList.add(area);
            }return areaDBList.isEmpty() ?null:areaDBList;         
     }
    /* Μέθοδος για ανάκτηση των Κατηγοριών
     * επιστροφή αντικειμένου τύπου Category
     *
     public ArrayList retrieveCategory()throws SQLException{
          ResultSet rs=DBManager.selectCategory.executeQuery();
          while (rs.next()){
                 int CategId = rs.getInt(1);
                 String CategName = rs.getString(2);
                 Category kat = new Category(CategId,CategName);
                 categoryDBList.add(kat);
          }return categoryDBList.isEmpty() ?null:categoryDBList;
     }
  
     /* Μέθοδος για ανάκτηση του Εύρους Τιμών
     * επιστροφή αντικειμένου τύπου PriceRange
     *
     public ArrayList retrievePriceRange()throws SQLException{
          ResultSet rs=DBManager.selectPriceRange.executeQuery();
          while (rs.next()){
                 int prID = rs.getInt(1);
                 String prRange = rs.getString(2);
                 PriceRange pr = new PriceRange(prID,prRange);
                 priceRangeDBList.add(pr);
          }return priceRangeDBList.isEmpty() ?null:priceRangeDBList;
     }
      
    /* Ανάκτηση όλων των Εστιατορίων από τη Βάση Δεδομένων
     * Επιστροφή λίστας με αντικείμενα τύπου Restaurant
     * created by Χρύσα Κυριαζή
     *
     public ArrayList retrieveRestaurants(){
            try {
             ResultSet restRs = DBManager.selectRestaurants.executeQuery();
             while(restRs.next()){
                    int restId = restRs.getInt(1);
                    String restName = restRs.getString(2);
                    String address = restRs.getString(3);
                    String phone = restRs.getString(5);
                    String descr = restRs.getString(6);       
                    String inFo = restRs.getString(7);
                    Area ar = areaDBList.get(2);
                    Category cat = categoryDBList.get(2);
                    PriceRange prRg = priceRangeDBList.get(2);
                    Restaurant est = new Restaurant(restId,restName,address,phone,descr,inFo,ar,cat,prRg);
                    ///img = restRs.getClob(10);    ---CharacterLongObject παίρνει το όνομα της φωτό (από αρχείο)
                    restaurantsDBList.add(est);
             } return restaurantsDBList.isEmpty() ?null:restaurantsDBList;
        }catch(SQLException ex) {
         Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE,null,ex);
         return null;
        }
}    
     /* Μέθοδος για ανάκτηση όλων των Αξιολογήσεων
     * επιστροφή λίστας αντικειμένων τύπου Evaluation 
     *
     public ArrayList retrieveEvaluations()throws SQLException{
          ResultSet rs=DBManager.selectEvaluations.executeQuery();
          while (rs.next()){
                 int evalId = rs.getInt(1);
                 Float quality = rs.getFloat(4);
                 Float price = rs.getFloat(5);
                 Float servTime = rs.getFloat(6);
                 Float average = rs.getFloat(7);
                 Restaurant restau = restaurantsDBList.get(2);
                 RegUser user = usersDBList.get(4);
                 Evaluation eval = new Evaluation(evalId,quality,price,servTime,average,restau,user);
                 evalDBList.add(eval);
          }return evalDBList.isEmpty() ?null:evalDBList;
     }
      
/* Μέθοδος για ανάκτηση όλων των Αξιολογήσεων
     * επιστροφή λίστας αντικειμένων τύπου Evaluation 
     *
     public ArrayList retrieveReservations()throws SQLException{
          ResultSet rs=DBManager.selectReservations.executeQuery();
          while (rs.next()){
                 int resId = rs.getInt("RESERVEID");
                 String state = rs.getString("KATASTASHKRATHSHS");
                 Date dateres = rs.getDate("DATEKRATHSHS");
                 Boolean conf = rs.getBoolean("EPIVEVAIOSH");
                 Restaurant rest = restaurantsDBList.get(2);
                 RegUser userR = usersDBList.get(4);
                 Reservation reserv = new Reservation(resId,state,dateres,conf,rest,userR);
                 reservDBList.add(reserv);
          }return reservDBList.isEmpty() ?null:reservDBList;
     }
     
     /* Μέθοδος για ανάκτηση όλων των Χρηστών
     * επιστροφή λίστας αντικειμένων τύπου Reguser 
     *
     public ArrayList retrieveUsers()throws SQLException{
          ResultSet rs=DBManager.selectUsers.executeQuery();
          while (rs.next()){
                 int userId = rs.getInt(1);                  //username
                 String uName = rs.getString(5);                 //firstname
                 String uLastName = rs.getString(4);             //lastname
                 String email = rs.getString(3);
                 String telePhone = rs.getString(6);
                 RegUser user = new RegUser(userId,uName,uLastName,email,telePhone);
                 usersDBList.add(user);
          }return usersDBList.isEmpty() ?null:usersDBList;
     }    
     
     /* Μέθοδος για δημιουργία λίστας Λογαριασμών χρήστη
     * επιστροφή λίστας αντικειμένων τύπου Account
     */
     public ArrayList<Account> getAccountsFromDB(){
         DBManager dbM = new DBManager();
         ResultSet accrs = null;
         try {
             System.out.println("1. So far, so good");
             accrs = dbM.selectUsers.executeQuery();
             System.out.println("2. So far, so good");
             
             while (accrs.next()){
                String userNm = accrs.getString("USERNAME");
                String passWord = accrs.getString("PASSWORD");
                Boolean isAdmin = accrs.getBoolean("ISADMIN");
                Account loginuser = new Account(userNm, passWord, isAdmin);
                accountDBList.add(loginuser);
             }
         } catch (SQLException ex) {
             Logger.getLogger(DBInterface.class.getName()).log(Level.SEVERE, null, ex);
         }
         return accountDBList;
     }    
     
          
// Μέθοδος μετατροπής ημερομηνίας για sql ερωτήματα @author Δημήτρης Λήντερ 2η ΓΕ
    public static String Util2SQLDate(java.util.Date date){
        GregorianCalendar tempDate = new GregorianCalendar();
        long milliseconds = date.getTime();
        tempDate.setTimeInMillis(milliseconds);
        String tempDateString = tempDate.toString();
        return tempDateString;
    }//End Method Util2SQLDate

    public ArrayList<Account> getAccountDBList() {
        return accountDBList;
    }
    
    public void addAccountToAccountDBList(Account account){
        accountDBList.add(account);
    }
}
